package com.it.schoolbookshop_back.controller;

import com.it.schoolbookshop_back.entities.dto.LoginDTO;
import com.it.schoolbookshop_back.entities.dto.LoginResponseDTO;
import com.it.schoolbookshop_back.entities.dto.RegisterDTO;
import com.it.schoolbookshop_back.entities.dto.UserSettingsDTO;
import com.it.schoolbookshop_back.entities.dto.UserSettingsNumericDTO;
import com.it.schoolbookshop_back.entities.po.Result;
import com.it.schoolbookshop_back.entities.po.User;
import com.it.schoolbookshop_back.enums.UserRoleEnums;
import com.it.schoolbookshop_back.service.UserService;
import com.it.schoolbookshop_back.utils.JwtUtil;
import com.it.schoolbookshop_back.utils.UserContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

/**
 * 用户控制器
 */
@RestController
@RequestMapping("/api/user")
public class UserController {

    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private UserService userService;

    /**
     * 用户登录
     *
     * @param loginDTO 登录信息
     * @return 登录结果
     */
    @PostMapping("/login")
    public Result<LoginResponseDTO> login(@RequestBody LoginDTO loginDTO) {
        // 参数校验
        if (loginDTO.getUsername() == null || loginDTO.getPassword() == null) {
            return Result.validateFailed("用户名或密码不能为空");
        }

        logger.info("用户登录: {}", loginDTO.getUsername());

        // 调用服务层进行登录验证
        User user = userService.login(loginDTO.getUsername(), loginDTO.getPassword());

        // 登录失败
        if (user == null) {
            logger.warn("登录失败: 用户名或密码错误 - {}", loginDTO.getUsername());
            return Result.validateFailed("用户名或密码错误");
        }

        logger.info("用户 {} 登录成功, 角色: {}", user.getUsername(), user.getRole());

        // 确保角色名称使用大写
        String role = user.getRole().toUpperCase();

        // 生成JWT令牌，包含用户角色信息
        String token = JwtUtil.generateToken(user.getId().toString(), user.getUsername(), role);

        // 返回token和用户角色
        LoginResponseDTO responseDTO = new LoginResponseDTO(token, role);
        return Result.success("登录成功", responseDTO);
    }

    /**
     * 用户注册
     *
     * @param registerDTO 注册信息
     * @return 注册结果
     */
    @PostMapping("/register")
    public Result<Integer> register(@RequestBody RegisterDTO registerDTO) {
        // 参数校验
        if (registerDTO.getUsername() == null || registerDTO.getUsername().trim().isEmpty()
                || registerDTO.getPassword() == null || registerDTO.getPassword().trim().isEmpty()) {
            return Result.failed("用户名、姓名和密码不能为空");
        }
        
        // 检查密码是否全是空格
        if (registerDTO.getPassword().trim().isEmpty()) {
            return Result.validateFailed("密码不能全是空格");
        }
        
        // 检查密码长度（可选：根据需求设置最小长度）
        if (registerDTO.getPassword().length() < 6) {
            return Result.validateFailed("密码长度不能少于6个字符");
        }
        
        // 删除用户名和密码中的首尾空格
        String username = registerDTO.getUsername().trim();
        String password = registerDTO.getPassword().trim();
        registerDTO.setUsername(username);
        registerDTO.setPassword(password);

        // 检查用户名是否已存在
        if (userService.isUsernameExists(registerDTO.getUsername())) {
            return Result.validateFailed("该用户名已被注册");
        }

        // 组装用户对象
        User user = new User();
        user.setUsername(registerDTO.getUsername());
        user.setPassword(registerDTO.getPassword());
        user.setStudentId(registerDTO.getStudentId());
        user.setRealName(registerDTO.getRealName());
        user.setDepartment(registerDTO.getDepartment());
        user.setEmail(registerDTO.getEmail());
        user.setPhone(registerDTO.getPhone());
        user.setWechat(registerDTO.getWechat());
        user.setBio(registerDTO.getBio());
        user.setRole(UserRoleEnums.STUDENT.name());
        
        // 记录日志
        logger.info("尝试注册新用户: {}", registerDTO.getUsername());

        // 调用服务层进行注册
        Integer userId = userService.register(user);

        // 注册失败
        if (userId == null) {
            logger.warn("用户注册失败: {}", registerDTO.getUsername());
            return Result.failed("注册失败，请稍后再试");
        }

        // 记录成功日志
        logger.info("用户注册成功: {}, ID: {}", registerDTO.getUsername(), userId);
        
        // 返回用户ID
        return Result.success("注册成功", userId);
    }

    /**
     * 获取用户设置信息
     *
     * @return 用户设置信息
     */
    @GetMapping("/settings")
    public Result<UserSettingsNumericDTO> getUserSettings() {
        // 从Token中获取用户ID
        Integer userId = UserContext.getUserId();
        if (userId == null) {
            return Result.unauthorized();
        }

        logger.info("请求获取用户设置信息: 用户ID={}", userId);

        // 调用服务获取用户设置
        UserSettingsDTO settings = userService.getUserSettings(userId);
        if (settings == null) {
            logger.warn("获取用户设置失败: 用户ID={}", userId);
            return Result.failed("获取用户设置失败");
        }

        // 转换为数字格式DTO
        UserSettingsNumericDTO numericSettings = UserSettingsNumericDTO.fromBooleanDTO(settings);

        logger.info("成功获取用户设置: 用户ID={}", userId);
        return Result.success("获取设置信息成功", numericSettings);
    }

    /**
     * 修改用户设置
     * 前端传需要修改的设置参数，后端接收后动态修改对应的设置值
     *
     * @param partialSettings 部分或全部设置信息
     * @return 更新后的用户设置
     */
    @PostMapping("/settings")
    public Result<UserSettingsNumericDTO> updateSettings(@RequestBody UserSettingsNumericDTO partialSettings) {
        // 从Token中获取用户ID
        Integer userId = UserContext.getUserId();
        if (userId == null) {
            return Result.unauthorized();
        }

        logger.info("请求修改用户设置: 用户ID={}", userId);

        // 参数校验
        if (partialSettings == null) {
            logger.warn("设置信息为空: 用户ID={}", userId);
            return Result.validateFailed("设置信息不能为空");
        }

        // 转换为布尔型DTO
        UserSettingsDTO booleanSettings = partialSettings.toBooleanDTO();

        // 更新用户设置
        boolean success = userService.updateUserSettings(userId, booleanSettings);
        if (!success) {
            logger.warn("更新用户设置失败: 用户ID={}", userId);
            return Result.failed("更新用户设置失败");
        }

        // 获取更新后的设置
        UserSettingsDTO updatedSettings = userService.getUserSettings(userId);
        if (updatedSettings == null) {
            logger.warn("获取更新后的用户设置失败: 用户ID={}", userId);
            return Result.failed("更新用户设置成功，但获取更新后的设置失败");
        }

        // 转换为数字格式DTO
        UserSettingsNumericDTO updatedNumericSettings = UserSettingsNumericDTO.fromBooleanDTO(updatedSettings);

        logger.info("成功修改用户设置: 用户ID={}", userId);
        return Result.success("修改成功", updatedNumericSettings);
    }
} 